package com.designpatterns.observerpattern;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

/**
 * 被观察者，产品列表
 */
public class ObservableProductList extends Observable {
    /**
     * 产品列表
     */
    private List<String> productList;
    /**
     * 类变量缓存本类实例
     */
    private static ObservableProductList instance;

    /**
     * 构造方法私有化禁止随意创建本类实例
     */
    private ObservableProductList() {
    }

    /**
     * 公共方法供外界获取单例
     */
    public static ObservableProductList getTheProductList() {
        if (instance == null) {
            instance = new ObservableProductList();
            instance.productList = new ArrayList<>();
            return instance;
        }
        return instance;
    }

    /**
     * 增加观察者的方法
     *
     * @param observer 观察者
     */
    public void addProductListObserver(Observer observer) {
        this.addObserver(observer);
    }

    /**
     * 新增产品
     *
     * @param newProduct 新产品
     */
    public void addProduct(String newProduct) {
        productList.add(newProduct);
        //设置被观察对象发生了变化，告知观察者，否则无法触发观察者的行为
        this.setChanged();
        //通知观察者并传递新产品，触发观察者的相应动作
        this.notifyObservers(newProduct);
    }

}
